package com.styles.codingstyle.dataobject;

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.validation.constraints.*;
import java.math.BigDecimal;

/**
 * @author 陈建
 * @Description:实体类基本映射方式; 所有字段均可以通过@Column(nullable = false,length = 200)的配置方式来控制数据表字段生成规则
 * @Date 2018/5/23 11:37
 */

/**
 * Data :lombok注解
 */
@Data
/**
 * Entity :数据映射
 */
@Entity
public class ObjEntity {
    /**
     * 主键注解
     */
    @Id
    /**
     * 主键生成策略
     *
     * 四种主键生成策略,其被定义在枚举类GenerationType中;
     *
     * GenerationType.TABLE :使用一个特定的数据库表格来保存主键,持久化引擎通过关系数据库的一张特定的表格来生成主键,
     * 一般与@TableGenerator注解一起使用;
     *
     * GenerationType.SEQUENCE :数据库中不支持主键自增长,比如Oracle,其提供了一种叫做"序列(sequence)"的机制生成主键,
     * 一般与@SequenceGenerator注解一起使用;
     *
     * GenerationType.IDENTITY :通常所说的主键自增长,数据库在插入数据时,会自动给主键赋值,
     * 使用自增长主键生成策略是只需要声明strategy = GenerationType.IDENTITY即可,同一张表中自增列最多只能有一列;
     *
     * GenerationType.AUTO :把主键生成策略交给持久化引擎(persistence engine),
     * 持久化引擎会根据数据库在以上三种主键生成策略中选择其中一种。此种主键生成策略比较常用,
     * 由于JPA默认的生成策略就是GenerationType.AUTO,所以使用此种策略时.
     * 可以显式的指定@GeneratedValue(strategy = GenerationType.AUTO)也可以直接@GeneratedValue
     */
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    /**
     * Null :限制只能为null
     */
    @Null(message = "{common.mustnull}")
    private String mustnull;

    /**
     * NotNull :限制必须不为null
     */
    @NotNull(message = "{common.mustnotnull}")
    private String mustnotnull;

    /**
     * 限制必须为false;默认值为null
     */
    @AssertFalse(message = "{common.mustFalse}")
    private Boolean mustFalse;

    /**
     * 限制必须为true;默认值为null;
     */
    @AssertTrue(message = "{common.mustTrue}")
    private Boolean mustTrue;


    /**
     * DecimalMax(value) :限制必须为一个不大于指定值的数字(最大值为)
     */
    @DecimalMax(value = "200", message = "{common.maxDecimalNumber}")
    private BigDecimal maxDecimalNumber;


    /**
     * DecimalMin(value) :限制必须为一个不小于指定值的数字(最小值为)
     */
    @DecimalMin(value = "10", message = "{common.minDecimalNumber}")
    private BigDecimal minDecimalNumber;


    /**
     * Digits(integer,fraction) :限制必须为一个小数，且整数部分的位数不能超过integer，小数部分的位数不能超过fraction
     */
    @Digits(integer = 20, fraction = 4, message = "{common.mustFloatPint}")
    private Double mustFloatPint;

    /**
     * Future :限制必须是一个将来的日期
     */
    //@Future(message = "{common.mustFutureTime}")
    // private Date mustFutureTime;

    /**
     * Past :限制必须是一个过去的日期;验证注解的元素值（日期类型）比当前时间早
     */
    // @Past(message = "{common.mustPastTime}")
    // private Date mustPastTime;

    /**
     * Max(value) :限制必须为一个不大于指定值的数字
     */
    @Max(value = 200, message = "{common.maxNumber}")
    private Integer maxNumber;

    /**
     * Min(value) :限制必须为一个不小于指定值的数字
     */
    @Min(value = 10, message = "{common.minNumber}")
    private Integer minNumber;

    /**
     * Pattern(value) :限制必须符合指定的正则表达式
     */
    // @Pattern(regexp = "")
    private String patternAll;

    /**
     * Size(max,min) :Validation注解,限制字符长度必须在min到max之间;
     */
    @Size(min = 3, max = 10, message = "{common.lengthMustIn}")
    private String lengthMustIn;

    /**
     * NotEmpty :验证注解的元素值不为null且不为空（字符串长度不为0、集合大小不为0）
     */
    @NotEmpty(message = "{common.mustNotEmpty}")
    private String mustNotEmpty;

    /**
     * NotBlank :验证注解的元素值不为空（不为null、去除首位空格后长度为0），不同于@NotEmpty，
     * <p>
     * NotBlank只应用于字符串且在比较时会去除字符串的空格
     */
    @NotBlank(message = "{common.mustNotBlank}")
    private String mustNotBlank;

    /**
     * Email :验证注解的元素值是Email，也可以通过正则表达式和flag指定自定义的email格式
     */
    @Email(message = "{common.email}")
    private String mustEmail;

}
